// 商品路由模块

// 加载模块
const express = require('express')
const goodsModel = require('../db/goodsModel.js')
const path = require('path')

// 创建路由表（空表）
const router = express.Router()

// 向路由表添加内容：

// 上传文件接口：
// 使用multer插件接收文件
// 安装：npm i multer
// multer版本："multer": "^1.4.5-lts.1"
// 加载模块
const multer = require('multer')

// 创建一个上传文件的对象upload
const upload = multer({
    limits: {
        // 限制上传文件最大为：500kb
        fileSize: 1024 *500
    },
    fileFilter: function (req,file,cb){
        // 只接收图片文件（png jpg jpeg gif svg）
        let reg = /\.(png|jpe?g|gif|svg)$/
        if (reg.test(file.originalname)) {
            // 上传文件是图片，接收文件
            cb(null,true)
        } else {
            // 上传文件不是图片，拒收文件
            cb(null,false)
        }
    },
    storage: multer.diskStorage({
        destination: function (req,file,cb){
            // 设置上传文件的存储目录
            cb(null,'./www/uploads')
        },
        filename: function (req,file,cb){
            // 设置上传文件的名称和后缀
            let filen = 'upload_'+Date.now()+'_'+parseInt(Math.random()*1000000)+path.extname(file.originalname)
            cb(null,filen)
        }
    })
})
let fun = upload.single('upload_img')// 接收单个文件
/**
* @api {post} /goods/upload 上传单个文件
* @apiGroup goods
*
* @apiParam {String} name 上传文件的名称为upload_img
*
* @apiSuccessExample 返回数据示例:
* {
*     "code": 1,
*     "msg": "上传成功",
*     "imgurl": "图片地址",
* }
*/
router.post('/upload',(req,res)=>{
    fun(req,res,(err)=>{
        // 接收文件完成时执行
        if (err) {
            // 上传文件大小超过限制了
            return res.send({"code":-1,"msg":"上传文件最大为500kb"})
        }
        // 当上传文件被拒收时，req.file 没有值 -> undefined
        if (!req.file) {
            // 上传文件被拒收了
            return res.send({"code":-2,"msg":"亲，只能上传图片文件"})
        }
        // 文件上传成功
        let imgurl = 'http://localhost:8080/static/uploads/'+ req.file.filename
        res.send({"code":1,"msg":"图片上传成功","imgurl":imgurl})
    })// 异步接收文件
})


// 创建一个上传文件的对象upload
const uploads = multer({
    limits: {
        // 限制上传文件最大为：500kb
        fileSize: 1024 *500
    },
    fileFilter: function (req,file,cb){
        // 只接收图片文件（png jpg jpeg gif svg）
        // let reg = /\.(png|jpg|jpeg|gif|svg)$/
        let reg = /\.(png|jpe?g|gif|svg)$/
        if (reg.test(file.originalname)) {
            // 上传文件是图片，接收文件
            cb(null,true)
        } else {
            // 上传文件不是图片，拒收文件
            cb(null,false)
        }
    },
    storage: multer.diskStorage({
        destination: function (req,file,cb){
            // 设置上传文件的存储目录
            cb(null,'./www/uploads')
        },
        filename: function (req,file,cb){
            // 设置上传文件的名称和后缀
            let filen = 'upload_'+Date.now()+'_'+parseInt(Math.random()*1000000)+path.extname(file.originalname)
            cb(null,filen)
        }
    })
})
let funs = uploads.array('upload_img')// 接收多个文件
/**
* @api {post} /goods/uploads 上传多个文件
* @apiGroup goods
*
* @apiParam {String} name 上传文件的名称为upload_img
*
* @apiSuccessExample 返回数据示例:
* {
*     "code": 1,
*     "msg": "上传成功",
*     "imgurls": ['url1','url2'],
* }
*/
router.post('/uploads',(req,res)=>{
    funs(req,res,(err)=>{
        // 接收文件完成时执行
        if (err) {
            // 上传文件大小超过限制了
            return res.send({"code":-1,"msg":"上传文件最大为500kb"})
        }
        // console.log( req.files )// [{req.file},{req.file},{req.file}]
        if (req.files.length === 0) {
            // 上传文件被拒收了
            return res.send({"code":-2,"msg":"亲，只能上传图片文件"})
        }
        // 文件上传成功
        let imgurls = []
        req.files.forEach((item)=>{
            let imgurl = 'http://localhost:8080/static/uploads/'+ item.filename
            imgurls.push(imgurl)
        })
        res.send({"code":1,"msg":"图片上传成功","imgurls":imgurls})
    })// 异步接收文件
})


// 添加商品接口：http://localhost:8080/goods/add
router.post('/add',(req,res)=>{
    // 获取请求体中的参数并解构赋值
    let {name,desc,price,type,imgurl} = req.body

    // 先查询数据库是否有要添加的商品
    goodsModel.find({name})
    .then((arr)=>{
        if (arr.length === 0) {
            // 数据库没有当前要添加的商品，添加一条数据
            return goodsModel.insertMany({name,desc,price,type,imgurl})
        } else {
            // 数据库已有当前要添加的商品
            res.send({"code":-1,"msg":"添加失败，商品已存在！"})
        }
    })
    .then((arr)=>{
        if (arr.length === 0) {
            res.send({"code":0,"msg":"添加失败"})
        }
        else{
            res.send({"code":1,"msg":"添加成功"})
        }
    })
})

// 删除商品接口：http://localhost:8080/goods/del
router.post('/del',(req,res)=>{
    // 获取请求参数并解构赋值
    let {name} = req.body

    // 删除数据库中的某条数据
    goodsModel.deleteOne({name})
    .then((result)=>{
        if (result.deletedCount === 1) {
            // 删除成功
            res.send({"code":1,"msg":"删除成功"})
        }
        else{
            // 删除失败
            res.send({"code":0,"msg":"删除失败"})
        }
    })
})

// 修改商品接口：http://localhost:8080/goods/update
router.post('/update',(req,res)=>{
    // 响应前端
    res.send({"code":1,"msg":"修改成功"})
})

// 关键字查询接口：http://localhost:8080/goods/search
router.post('/search',(req,res)=>{
    // 获取请求参数并解构赋值
    let {kw} = req.body

    // 匹配关键字的正则
    let reg = new RegExp(kw)

    // 查询数据库
    goodsModel.find({$or:[{name:{$regex:reg}},{desc:{$regex:reg}},{price:{$regex:reg}},{type:{$regex:reg}}]})
    .then((arr)=>{
        if (arr.length === 0) {
            res.send({"code":0,"msg":"暂无数据","data":arr})
        } else {
            res.send({"code":1,"msg":"搜索成功","data":arr})
        }
    })
})

// 分页查询接口：http://localhost:8080/goods/getpage
router.get('/getpage',(req,res)=>{
    // 获取请求参数并解构赋值
    let {page=1,size=4} = req.query
    // page 页码
    // size 每一页条数
    let pages = 0 // 总页数
    let count = 0 // 总条数
    // 总条数：12
    // 每一页条数：4
    // 总页数：Math.ceil(count/size)

    // 查询所有数据
    goodsModel.find()
    .then((arr)=>{
        count = arr.length // 总条数
        pages = Math.ceil(count/size) // 总页数

        // 查询指定页码的数据:
        // find()查询所有数据
        // limit(4)限制查询4条数据
        // skip(4)跳过4条数据后开始查询
        // goodsModel.find().limit(4).skip(0) // 跳过0条数据后，查询4条数据 1
        // goodsModel.find().limit(4).skip(4) // 跳过4条数据后，查询4条数据 2
        // goodsModel.find().limit(4).skip(8) // 跳过8条数据后，查询4条数据 3
        page = Number(page) // 转成数字
        size = Number(size) // 转成数字
        // 跳过x条数据后，查询size条数据
        return goodsModel.find().limit(size).skip((page-1)*size) 
    })
    .then((arr)=>{
        // 响应前端
        res.send({"code":1,"msg":"分页查询成功","data":arr,"page":page,"pages":pages,"count":count})
    })
})

// 导出路由表
module.exports = router
